Linux V4L2 应用开发

📖 精选 ✍️ Jason | 📅 2026-03-11 | 👍 0 | 原帖↗
#知识星球 #立芯嵌入式 #来源/立芯星球 #技术/V4L2 #技术/摄像头 #技术/Linux驱动 #质量/普通

原帖 | Jason | 2026-03-11 14:24 | 👍0 | 阅读约1

Linux V4L2 应用开发流程

  1. 打开视频设备文件

  2. 操作:调用  open("/dev/videoX", O_RDWR)  得到文件描述符  fd 

  3. 作用:建立应用与摄像头设备的连接,获取后续操作的“入口凭证”

  4. 查询/设置设备参数

  5. 查询能力: ioctl(fd, VIDIOC_QUERYCAP, &cap)  → 确认设备支持视频采集

  6. 设置格式: ioctl(fd, VIDIOC_S_FMT, &fmt)  → 指定分辨率、像素格式(如 640×480、YUYV)
  7. 设置帧率: ioctl(fd, VIDIOC_S_PARM, &para)  → 指定每秒采集帧数(如 30fps)
  8. 作用:和摄像头“约定好”画面规格,确保双方能正常通信

  9. 申请帧缓冲 + 内存映射

  10. 申请缓冲: ioctl(fd, VIDIOC_REQBUFS, &req)  → 向内核申请多个数据缓冲块

  11. 内存映射: mmap()  → 将内核缓冲地址映射到应用空间,直接读写摄像头数据(避免拷贝,提升效率)
  12. 作用:准备好存放画面数据的“临时仓库”

  13. 入队 + 启动采集

  14. 入队空缓冲: ioctl(fd, VIDIOC_QBUF, &buf)  → 把空缓冲交给内核,等待摄像头写入数据

  15. 开启流: ioctl(fd, VIDIOC_STREAMON, &type)  → 启动摄像头,开始持续采集画面
  16. 作用:让摄像头进入“工作状态”,往缓冲里填充新画面

  17. 出队 + 处理画面

  18. 出队满缓冲: ioctl(fd, VIDIOC_DQBUF, &buf)  → 取出已填充好画面的缓冲

  19. 图像处理:执行自定义逻辑(如保存图片、显示、AI识别)
  20. 作用:拿到原始画面数据,进行业务处理

  21. 循环入队(反复采集)

  22. 操作:处理完后再次调用  ioctl(fd, VIDIOC_QBUF, &buf) 

  23. 作用:将空缓冲重新放回队列,让摄像头继续填充新画面,实现持续采集

  24. 结束采集

  25. 停止流: ioctl(fd, VIDIOC_STREAMOFF, &type)  → 让摄像头停止采集

  26. 释放资源: munmap()  解除内存映射, close(fd)  关闭设备文件
  27. 作用:安全释放所有资源,避免内存泄漏

💡 核心逻辑一句话总结

打开设备 → 约定画面规格 → 申请数据仓库 → 循环“取图-处理-还仓库” → 下班关设备

6843825724a2.jpg

e0dbbb10dafc.jpg


相关笔记